#include "XmlMgr.h"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"

SetXML::SetXML(void)
{
	CreateTitle(&m_doc);
	CreateRootNode("root");
}

SetXML::~SetXML(void)
{
}
/************************************************************************/
/* 
/************************************************************************/
void SetXML::CreateTitle(xml_document<>* doc)
{
	xml_node<>* title = doc->allocate_node(rapidxml::node_pi,doc->allocate_string("xml version='1.0' encoding='ANSI'"));
	doc->append_node(title);
}

void SetXML::CreateNode(xml_document<>* doc, xml_node<>* node, const char* item, const char* val)
{
	node->append_node(doc->allocate_node(node_element, item, val));
}

void SetXML::CreateRootNode(const char* root)
{
	//CreateNode(&m_doc, root);
	m_root =  m_doc.allocate_node(node_element,root,NULL);
	//CreateNode(&m_doc, m_root, root, NULL);
	m_doc.append_node(m_root);
}

/************************************************************************/
/* 
/************************************************************************/
void SetXML::CreateSection(const char* name)
{
	m_sec = m_doc.allocate_node(node_element, name, NULL);
	//m_sec = m_doc.first_node();
	m_root->append_node(m_sec);
}

void SetXML::CreateValue(const char* name, const char* val)
{
	CreateNode(&m_doc, m_root, name, val);
}

void SetXML::Save(const char* file)
{
	std::ofstream out(file);
	out << m_doc;
}

/************************************************************************/
/* 
/* GetXML
/* 
/************************************************************************/
void GetXML::GetValue(const char* sec, const char* name, char* val)
{
	rapidxml::xml_node<>* root = m_doc.first_node();
	rapidxml::xml_node<>* it = root->first_node(sec);
	for(;NULL != it;
		it = it->next_sibling())
	{
		if (0 == strcmp(name, it->name()))
		{
			strcpy(val, it->value());
		}
	}
}

void GetXML::Open(const char* file)
{
	rapidxml::file<> fdoc(file);
	//std::cout<<fdoc.data()<<std::endl;
	m_doc.parse<0>(fdoc.data()); 
}